from django.shortcuts import render

# Create your views here.
from utils.views import LoginRequiredJSONMixin
from django.views import View
from apps.orders.models import OrderInfo
from django.http import JsonResponse
from alipay import AliPay,AliPayConfig
from meiduo import settings


class PaymentView(LoginRequiredJSONMixin, View):
    """订单支付功能"""
    def get(self,request, order_id):
        # 1.拿前端订单参数
        # 2.验证订单数据
        try:
            order=OrderInfo.objects.get(order_id=order_id,user=request.user,status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except Exception:
            return JsonResponse({'code':400,'errmsg':'该订单不存在'})
        # 3.获得支付宝请求
        # 3.1创建实例
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid="2021000122675584",
            app_notify_url=None,  # 默认回调 url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=False,  # 默认 False
            verbose=False,  # 输出调试数据
            config=AliPayConfig(timeout=15)  # 可选，请求超时时间
        )
        # 3.2获得支付宝url
        subject = "微淘划购--订单号：{}".format(order.order_id) #标题

        # 电脑网站支付，需要跳转到：https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order.order_id,
            total_amount=str(order.total_amount),
            subject=subject,
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url="https://example.com/notify"  # 可选，不填则使用默认 notify url
        )
        alipay_url = settings.ALIPAY_URL + "?" + order_string
        return JsonResponse({'code':0,'errmsg':'ok','alipay_url':alipay_url})


from apps.payment.models import Payment
class PaymentStatusView(LoginRequiredJSONMixin,View):
    """保存订单支付结果"""
    def put(self,request):
        # 1.拿到前端数据
        datas=request.GET.dict()
        # 2.校验重定向是否是支付宝过来的
        signature = datas.pop("sign")
        # verification
        # 创建实例
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()
        alipay = AliPay(
            appid="2021000122675584",
            app_notify_url=None,  # 默认回调 url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=False,  # 默认 False
            verbose=False,  # 输出调试数据
            config=AliPayConfig(timeout=15)  # 可选，请求超时时间
        )
        success = alipay.verify(datas, signature)
        if success:
            # 3.数据入库
            # 读取order_id
            order_id = datas.get('out_trade_no')
            # 读取支付宝流水号
            trade_id = datas.get('trade_no')
            # 保存Payment模型类数据
            Payment.objects.create(
                order_id=order_id,
                trade_id=trade_id
            )
            #修改该订单状态
            OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
            # 响应trade_id
            return JsonResponse({'code': 0, 'errmsg': 'OK', 'trade_id': trade_id})
        else:
            # 4.返回json
            # 订单支付失败，重定向到我的订单
            return JsonResponse({'code': 400, 'errmsg': '非法请求'})




